﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BCR.Imagenes.Servicios.Componentes;
using EntitiesLayer;

namespace Bitacora
{
    public enum TipoError { Error, Log, Informacion, Proceso };
    public enum Acciones { Iniciar_Servicio, Detener_Servicio, Logueo_Exitoso_IIF, Deslogueo_IIF,Fallo_Conectar_IIF,Fin_Proceso };

    /// <summary>
    /// 
    /// </summary>
    public class Services
    {
        /// <summary>
        /// Permite la creación de cada linea del log.
        /// </summary>
        /// <param name="error">Tipo de Error del mensaje.</param>
        /// <param name="descripcion">Descripcion del error generado.</param>
        /// <returns>String con el mensaje a ser eescritorio en el archivo de log.</returns>
        public static string Mensaje(TipoError error, string descripcion)
        {
            return DateTime.Now.ToString("yyyy'-'MM'-'dd HH':'mm':'ss':'fff") + " - " + error.ToString() + " - " + descripcion + "\r\n";
        }

        /// <summary>
        /// Traduce las acciones realizadas de acuerdo a los Enum, con ello poder facilitar las Acciones correspondientes
        /// a los servicios del BCR
        /// </summary>
        /// <param name="accion"></param>
        /// <returns>Accion a ser insertada en los servicios del BCR</returns>
        public static Parametro.ACCIONES TraducirAcciones(Acciones accion)
        {
            switch (accion)
            {
                case Acciones.Deslogueo_IIF: return Parametro.ACCIONES.LOGOFF;
                case Acciones.Detener_Servicio: return Parametro.ACCIONES.DESACTIVAR;
                case Acciones.Fallo_Conectar_IIF: return Parametro.ACCIONES.INTENTO_LOGIN;
                case Acciones.Iniciar_Servicio: return Parametro.ACCIONES.ACTIVAR;
                case Acciones.Logueo_Exitoso_IIF: return Parametro.ACCIONES.LOGIN;
                case Acciones.Fin_Proceso: return Parametro.ACCIONES.DESACTIVAR;
                default: return Parametro.ACCIONES.ACTIVAR;
            }            
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="nombreAplicacion">Nombre de la aplicacion o servicio en ejecución.</param>
        /// <param name="codigoError">Código en numeros del error generado.</param>
        /// <param name="descripcion">Descripción del error.</param>
        /// <param name="metodo">Método donde fue generado el mensaje.</param>
        /// <param name="error">Tipo de error generado.</param>
        /// <param name="exc">Excepción generada.</param>
        /// <param name="accion">Accion realizada al momento cuando fue generado el error.</param>
        /// <param name="cantidad">Cantidad de objetos en proceso.</param>
        public static void EnviarLog(string nombreAplicacion, int codigoError, string descripcion, string metodo, TipoError error, Exception exc = null, Acciones accion = Acciones.Iniciar_Servicio, int cantidad = 0)
        {
            if (Logger.RevisarEscritura(error))
            {
                #region File Write
                if (Configuracion.registrarLogFileSystem)//if fileWrite
                {
                    try
                    {
                        if ((error == TipoError.Error) && (exc != null))
                            Logger.EscrituraArchivo(nombreAplicacion, Mensaje(error, descripcion + " Error Description [" + exc.Message + "]"));
                        else
                            Logger.EscrituraArchivo(nombreAplicacion, Mensaje(error, descripcion));
                    }
                    catch { }
                }

                #endregion

                #region Services Write
                
                switch (error)
                {
                    case TipoError.Log:
                        {
                            try
                            {
                                AdministrarAuditoria.AdministrarSinRespuesta(Configuracion.identificacionSistema, nombreAplicacion, "NA", TraducirAcciones(accion), descripcion);
                            }
                            catch (Exception ex)
                            {
                                string mensajeTexto = Mensaje(error, "Error al enviar al Web Service de Bitacora el siguiente mensaje(" + ex.Message + "): " + descripcion);
                                try
                                {
                                    Logger.EscrituraArchivo(nombreAplicacion, mensajeTexto);
                                }
                                catch (Exception e)
                                {
                                    Logger.LogEnWindows("El sistema de bitacoras esta caido, imposible continuar con la aplicacion[mensaje: " + mensajeTexto + "]", "Unisys Query System", "Unisys Query System");
                                    System.Environment.Exit(0);
                                }
                            }
                        } break;

                    case TipoError.Informacion:
                        {
                            try
                            {
                                AdministrarTraces.AdministrarSinRespuesta(Configuracion.identificacionSistema, nombreAplicacion, metodo, descripcion);
                            }
                            catch (Exception ex)
                            {
                                string mensajeTexto = Mensaje(error, "Error al enviar al Web Service de Trace el siguiente mensaje(" + ex.Message + "): " + descripcion);
                                try
                                {
                                    Logger.EscrituraArchivo(nombreAplicacion,mensajeTexto);
                                }
                                catch (Exception e)
                                {
                                    Logger.LogEnWindows("El sistema de bitacoras esta caido, imposible continuar con la aplicacion[mensaje: " + mensajeTexto + "]", "Unisys Query System", "Unisys Query System");
                                    System.Environment.Exit(0);
                                }
                                
                            }
                        } break;
                    
                    case TipoError.Error:
                        {
                            try
                            {
                                AdministrarErrores.AdministrarSinRespuesta(Configuracion.identificacionSistema,codigoError,exc,nombreAplicacion,metodo);                                
                            }
                            catch (Exception ex)
                            {
                                string mensajeTexto = Mensaje(error, "Error al enviar al Web Service de Errores el siguiente mensaje(" + ex.Message + "): " + descripcion);
                                try
                                {
                                    Logger.EscrituraArchivo(nombreAplicacion,mensajeTexto);
                                }
                                catch (Exception e)
                                {
                                    Logger.LogEnWindows("El sistema de bitacoras esta caido, imposible continuar con la aplicacion[mensaje: " + mensajeTexto + "]", "Unisys Query System", "Unisys Query System");
                                    System.Environment.Exit(0);
                                }
                            }
                        } break;

                    case TipoError.Proceso:
                        {
                            try
                            {
                                AdministrarProcesos.AdministrarSinRespuesta(Configuracion.identificacionSistema, "NA", "NA", metodo, descripcion, "NA", cantidad, "NA");
                            }
                            catch (Exception ex)
                            {
                                string mensajeTexto = Mensaje(error, "Error al enviar al Web Service de Errores el siguiente mensaje(" + ex.Message + "): " + descripcion);
                                try
                                {
                                    Logger.EscrituraArchivo(nombreAplicacion, mensajeTexto);
                                }
                                catch (Exception e)
                                {
                                    Logger.LogEnWindows("El sistema de bitacoras esta caido, imposible continuar con la aplicacion[mensaje: " + mensajeTexto + "]", "Unisys Query System", "Unisys Query System");
                                    System.Environment.Exit(0);
                                }
                            }
                        } break;

                }
                #endregion
            }
        }
    }

}
